<!DOCTYPE HTML>
<title>Canvas tests - report generator</title>
<link rel="stylesheet" href="../reportgen.css">
<script src="../reportgen.js"></script>
<p>This is mainly for my own use, so it is not designed to be user-friendly.
If anyone else wants to use it for some reason, just wait
until "tests not yet loaded" and "tests not yet completed" get down to zero, then click the
pass/fail button for any test it shows where it cannot work out the answer (or use the
<kbd>y</kbd>/<kbd>n</kbd> keys to choose for the magenta-highlighted case), then use the
buttons at the bottom to collect all the results.
<form id="f">
<p><label for="loading">Tests not yet loaded:</label> <input id="loading" value="0" readonly>
<p><label for="waiting">Tests not yet completed:</label> <input id="waiting" value="0" readonly>
<p><button type="button" onclick="showUnfinished()">Show uncompleted tests</button>
   <button type="button" onclick="showAll()">Show all tests</button>
   <!--<button type="button" onclick="avoidFrameLimit()">HACK: work around frame limit</button>
   <button type="button" onclick="makeObjects()">HACK: s/iframe/object/</button>-->
<hr>
<p><label for="passed">Detected passes:</label> <input id="passed" value="0" readonly>
<p><label for="failed">Detected fails:</label> <input id="failed" value="0" readonly>
<hr>
<table>
<tr>
<th>Test name
<th>Test case
<th>Pass?
<th>Fail?
<th>Notes
<script>
createTable( [
"fallback.basic",
"fallback.multiple",
"fallback.nested",
"type.name",
"type.exists",
"type.delete",
"type.prototype",
"type.replace",
"type.extend",
"size.attributes",
"size.attributes.type.get",
"size.attributes.type.set",
"size.attributes.default",
"size.attributes.reflect.1",
"size.attributes.reflect.2",
"size.attributes.removed",
"size.attributes.parse.whitespace",
"size.attributes.parse.nonnumber",
"size.attributes.parse.zero",
"size.attributes.parse.negative",
"size.attributes.parse.zerosuffix",
"size.attributes.parse.floatsuffix",
"size.attributes.parse.badsuffix",
"size.attributes.parse.percentsuffix",
"size.attributes.setAttribute.whitespace",
"size.attributes.setAttribute.nonnumber",
"size.attributes.setAttribute.zero",
"size.attributes.setAttribute.negative",
"size.attributes.setAttribute.zerosuffix",
"size.attributes.setAttribute.floatsuffix",
"size.attributes.setAttribute.badsuffix",
"size.attributes.setAttribute.percentsuffix",
"size.attributes.style",
"initial.colour",
"initial.reset.different",
"initial.reset.same",
"initial.reset.path",
"initial.reset.clip",
"initial.reset.transform",
"initial.reset.gradient",
"initial.reset.pattern",
"context.emptystring",
"context.unrecognised.badname",
"context.unrecognised.badsuffix",
"context.unrecognised.nullsuffix",
"context.unrecognised.unicode",
"context.casesensitive",
"context.arguments.missing",
"context.arguments.extra",
"toDataURL.default",
"toDataURL.png",
"toDataURL.unrecognised",
"toDataURL.lowercase",
"toDataURL.arguments.1",
"toDataURL.arguments.2",
"toDataURL.arguments.3",
"toDataURL.nocontext",
"toDataURL.zerosize",
"toDataURL.primarycolours",
"toDataURL.complexcolours",
"security.drawImage.image",
"security.drawImage.canvas",
"security.pattern.create",
"security.pattern.cross",
"security.pattern.canvas.timing",
"security.pattern.image.fillStyle",
"security.pattern.canvas.fillStyle",
"security.pattern.image.strokeStyle",
"security.pattern.canvas.strokeStyle",
"security.dataURI",
"security.reset",
"2d.getcontext.exists",
"2d.type.exists",
"2d.type.delete",
"2d.type.prototype",
"2d.type.replace",
"2d.type.extend",
"2d.getcontext.unique",
"2d.getcontext.shared",
"2d.voidreturn",
"2d.missingargs",
"2d.coordinatespace",
"2d.scaled",
"2d.canvas.reference",
"2d.canvas.readonly",
"2d.state.saverestore.strokeStyle",
"2d.state.saverestore.fillStyle",
"2d.state.saverestore.globalAlpha",
"2d.state.saverestore.lineWidth",
"2d.state.saverestore.lineCap",
"2d.state.saverestore.lineJoin",
"2d.state.saverestore.miterLimit",
"2d.state.saverestore.shadowOffsetX",
"2d.state.saverestore.shadowOffsetY",
"2d.state.saverestore.shadowBlur",
"2d.state.saverestore.shadowColor",
"2d.state.saverestore.globalCompositeOperation",
"initial.reset.2dstate",
"2d.state.saverestore.transformation",
"2d.state.saverestore.clip",
"2d.state.saverestore.path",
"2d.state.saverestore.bitmap",
"2d.state.saverestore.stack",
"2d.state.saverestore.stackdepth",
"2d.state.saverestore.underflow",
"2d.transformation.order",
"2d.transformation.scale.basic",
"2d.transformation.scale.zero",
"2d.transformation.scale.negative",
"2d.transformation.scale.large",
"2d.transformation.scale.nonfinite",
"2d.transformation.scale.multiple",
"2d.transformation.rotate.zero",
"2d.transformation.rotate.radians",
"2d.transformation.rotate.direction",
"2d.transformation.rotate.wrap",
"2d.transformation.rotate.wrapnegative",
"2d.transformation.rotate.nonfinite",
"2d.transformation.translate.basic",
"2d.transformation.translate.nonfinite",
"2d.transformation.transform.identity",
"2d.transformation.transform.skewed",
"2d.transformation.transform.multiply",
"2d.transformation.transform.nonfinite",
"2d.transformation.setTransform.skewed",
"2d.transformation.setTransform.multiple",
"2d.transformation.setTransform.nonfinite",
"2d.composite.globalAlpha.range",
"2d.composite.globalAlpha.invalid",
"2d.composite.globalAlpha.default",
"2d.composite.globalAlpha.fill",
"2d.composite.globalAlpha.image",
"2d.composite.globalAlpha.canvas",
"2d.composite.globalAlpha.imagepattern",
"2d.composite.globalAlpha.canvaspattern",
"2d.composite.solid.source-over",
"2d.composite.solid.destination-over",
"2d.composite.solid.source-in",
"2d.composite.solid.destination-in",
"2d.composite.solid.source-out",
"2d.composite.solid.destination-out",
"2d.composite.solid.source-atop",
"2d.composite.solid.destination-atop",
"2d.composite.solid.xor",
"2d.composite.solid.copy",
"2d.composite.solid.lighter",
"2d.composite.transparent.source-over",
"2d.composite.transparent.destination-over",
"2d.composite.transparent.source-in",
"2d.composite.transparent.destination-in",
"2d.composite.transparent.source-out",
"2d.composite.transparent.destination-out",
"2d.composite.transparent.source-atop",
"2d.composite.transparent.destination-atop",
"2d.composite.transparent.xor",
"2d.composite.transparent.copy",
"2d.composite.transparent.lighter",
"2d.composite.image.source-over",
"2d.composite.image.destination-over",
"2d.composite.image.source-in",
"2d.composite.image.destination-in",
"2d.composite.image.source-out",
"2d.composite.image.destination-out",
"2d.composite.image.source-atop",
"2d.composite.image.destination-atop",
"2d.composite.image.xor",
"2d.composite.image.copy",
"2d.composite.image.lighter",
"2d.composite.canvas.source-over",
"2d.composite.canvas.destination-over",
"2d.composite.canvas.source-in",
"2d.composite.canvas.destination-in",
"2d.composite.canvas.source-out",
"2d.composite.canvas.destination-out",
"2d.composite.canvas.source-atop",
"2d.composite.canvas.destination-atop",
"2d.composite.canvas.xor",
"2d.composite.canvas.copy",
"2d.composite.canvas.lighter",
"2d.composite.uncovered.fill.source-in",
"2d.composite.uncovered.fill.destination-in",
"2d.composite.uncovered.fill.source-out",
"2d.composite.uncovered.fill.destination-atop",
"2d.composite.uncovered.fill.copy",
"2d.composite.uncovered.image.source-in",
"2d.composite.uncovered.image.destination-in",
"2d.composite.uncovered.image.source-out",
"2d.composite.uncovered.image.destination-atop",
"2d.composite.uncovered.image.copy",
"2d.composite.uncovered.pattern.source-in",
"2d.composite.uncovered.pattern.destination-in",
"2d.composite.uncovered.pattern.source-out",
"2d.composite.uncovered.pattern.destination-atop",
"2d.composite.uncovered.pattern.copy",
"2d.composite.clip.source-over",
"2d.composite.clip.destination-over",
"2d.composite.clip.source-in",
"2d.composite.clip.destination-in",
"2d.composite.clip.source-out",
"2d.composite.clip.destination-out",
"2d.composite.clip.source-atop",
"2d.composite.clip.destination-atop",
"2d.composite.clip.xor",
"2d.composite.clip.copy",
"2d.composite.clip.lighter",
"2d.composite.operation.get",
"2d.composite.operation.unrecognised",
"2d.composite.operation.darker",
"2d.composite.operation.over",
"2d.composite.operation.clear",
"2d.composite.operation.highlight",
"2d.composite.operation.nullsuffix",
"2d.composite.operation.casesensitive",
"2d.composite.operation.default",
"2d.fillStyle.parse.html4",
"2d.fillStyle.parse.hex3",
"2d.fillStyle.parse.hex6",
"2d.fillStyle.parse.rgb-num",
"2d.fillStyle.parse.rgb-clamp-1",
"2d.fillStyle.parse.rgb-clamp-2",
"2d.fillStyle.parse.rgb-clamp-3",
"2d.fillStyle.parse.rgb-clamp-4",
"2d.fillStyle.parse.rgb-clamp-5",
"2d.fillStyle.parse.rgb-percent",
"2d.fillStyle.parse.rgba-solid-1",
"2d.fillStyle.parse.rgba-solid-2",
"2d.fillStyle.parse.rgba-num-1",
"2d.fillStyle.parse.rgba-num-2",
"2d.fillStyle.parse.rgba-percent",
"2d.fillStyle.parse.rgba-clamp-1",
"2d.fillStyle.parse.rgba-clamp-2",
"2d.fillStyle.parse.transparent-1",
"2d.fillStyle.parse.transparent-2",
"2d.fillStyle.parse.hsl-1",
"2d.fillStyle.parse.hsl-2",
"2d.fillStyle.parse.hsl-3",
"2d.fillStyle.parse.hsl-4",
"2d.fillStyle.parse.hsl-5",
"2d.fillStyle.parse.hsl-clamp-1",
"2d.fillStyle.parse.hsl-clamp-2",
"2d.fillStyle.parse.hsl-clamp-3",
"2d.fillStyle.parse.hsl-clamp-4",
"2d.fillStyle.parse.hsla-1",
"2d.fillStyle.parse.hsla-2",
"2d.fillStyle.parse.hsla-clamp-1",
"2d.fillStyle.parse.hsla-clamp-2",
"2d.fillStyle.parse.hsla-clamp-3",
"2d.fillStyle.parse.hsla-clamp-4",
"2d.fillStyle.parse.hsla-clamp-5",
"2d.fillStyle.parse.hsla-clamp-6",
"2d.fillStyle.parse.svg-1",
"2d.fillStyle.parse.svg-2",
"2d.fillStyle.parse.invalid.hex3",
"2d.fillStyle.parse.invalid.hex6",
"2d.fillStyle.parse.invalid.rgb-1",
"2d.fillStyle.parse.invalid.rgb-2",
"2d.fillStyle.parse.invalid.rgb-3",
"2d.fillStyle.parse.invalid.rgb-4",
"2d.fillStyle.parse.invalid.rgb-5",
"2d.fillStyle.parse.invalid.rgb-6",
"2d.fillStyle.parse.invalid.rgb-7",
"2d.fillStyle.parse.invalid.rgba-1",
"2d.fillStyle.parse.invalid.rgba-2",
"2d.fillStyle.parse.invalid.rgba-3",
"2d.fillStyle.parse.invalid.rgba-4",
"2d.fillStyle.parse.invalid.rgba-5",
"2d.fillStyle.parse.invalid.hsl-1",
"2d.fillStyle.parse.invalid.hsl-2",
"2d.fillStyle.parse.invalid.hsl-3",
"2d.fillStyle.parse.invalid.hsl-4",
"2d.fillStyle.parse.invalid.hsl-5",
"2d.fillStyle.parse.invalid.hsla-1",
"2d.fillStyle.parse.invalid.hsla-2",
"2d.fillStyle.parse.system",
"2d.fillStyle.parse.current.basic",
"2d.fillStyle.parse.current.changed",
"2d.fillStyle.parse.current.removed",
"2d.fillStyle.invalidstring",
"2d.fillStyle.invalidtype",
"2d.fillStyle.get.solid",
"2d.fillStyle.get.semitransparent",
"2d.fillStyle.get.transparent",
"2d.fillStyle.default",
"2d.strokeStyle.default",
"2d.gradient.object.type",
"2d.gradient.object.return",
"2d.gradient.interpolate.solid",
"2d.gradient.interpolate.colour",
"2d.gradient.interpolate.alpha",
"2d.gradient.interpolate.colouralpha",
"2d.gradient.interpolate.outside",
"2d.gradient.interpolate.zerosize",
"2d.gradient.interpolate.vertical",
"2d.gradient.interpolate.multiple",
"2d.gradient.interpolate.overlap",
"2d.gradient.interpolate.overlap2",
"2d.gradient.empty",
"2d.gradient.object.update",
"2d.gradient.object.compare",
"2d.gradient.object.crosscanvas",
"2d.gradient.object.invalidoffset",
"2d.gradient.object.invalidcolour",
"2d.gradient.linear.nonfinite",
"2d.gradient.linear.transform.1",
"2d.gradient.linear.transform.2",
"2d.gradient.linear.transform.3",
"2d.gradient.radial.negative",
"2d.gradient.radial.nonfinite",
"2d.gradient.radial.inside1",
"2d.gradient.radial.inside2",
"2d.gradient.radial.inside3",
"2d.gradient.radial.outside1",
"2d.gradient.radial.outside2",
"2d.gradient.radial.outside3",
"2d.gradient.radial.touch1",
"2d.gradient.radial.touch2",
"2d.gradient.radial.touch3",
"2d.gradient.radial.equal",
"2d.gradient.radial.cone.behind",
"2d.gradient.radial.cone.front",
"2d.gradient.radial.cone.bottom",
"2d.gradient.radial.cone.top",
"2d.gradient.radial.cone.beside",
"2d.gradient.radial.cone.cylinder",
"2d.gradient.radial.cone.shape1",
"2d.gradient.radial.cone.shape2",
"2d.gradient.radial.transform.1",
"2d.gradient.radial.transform.2",
"2d.gradient.radial.transform.3",
"2d.pattern.basic.type",
"2d.pattern.basic.image",
"2d.pattern.basic.canvas",
"2d.pattern.basic.zerocanvas",
"2d.pattern.basic.nocontext",
"2d.pattern.image.undefined",
"2d.pattern.image.null",
"2d.pattern.image.string",
"2d.pattern.image.incomplete",
"2d.pattern.image.broken",
"2d.pattern.repeat.empty",
"2d.pattern.repeat.null",
"2d.pattern.repeat.undefined",
"2d.pattern.repeat.unrecognised",
"2d.pattern.repeat.case",
"2d.pattern.repeat.nullsuffix",
"2d.pattern.modify.image1",
"2d.pattern.modify.image2",
"2d.pattern.modify.canvas1",
"2d.pattern.modify.canvas2",
"2d.pattern.crosscanvas",
"2d.pattern.paint.norepeat.basic",
"2d.pattern.paint.norepeat.outside",
"2d.pattern.paint.norepeat.coord1",
"2d.pattern.paint.norepeat.coord2",
"2d.pattern.paint.norepeat.coord3",
"2d.pattern.paint.repeat.basic",
"2d.pattern.paint.repeat.outside",
"2d.pattern.paint.repeat.coord1",
"2d.pattern.paint.repeat.coord2",
"2d.pattern.paint.repeat.coord3",
"2d.pattern.paint.repeatx.basic",
"2d.pattern.paint.repeatx.outside",
"2d.pattern.paint.repeatx.coord1",
"2d.pattern.paint.repeaty.basic",
"2d.pattern.paint.repeaty.outside",
"2d.pattern.paint.repeaty.coord1",
"2d.pattern.paint.orientation.image",
"2d.pattern.paint.orientation.canvas",
"2d.pattern.animated.gif",
"2d.line.defaults",
"2d.line.width.basic",
"2d.line.width.transformed",
"2d.line.width.invalid",
"2d.line.cap.butt",
"2d.line.cap.round",
"2d.line.cap.square",
"2d.line.cap.open",
"2d.line.cap.closed",
"2d.line.cap.invalid",
"2d.line.join.bevel",
"2d.line.join.round",
"2d.line.join.miter",
"2d.line.join.open",
"2d.line.join.closed",
"2d.line.join.parallel",
"2d.line.join.invalid",
"2d.line.miter.exceeded",
"2d.line.miter.acute",
"2d.line.miter.obtuse",
"2d.line.miter.rightangle",
"2d.line.miter.lineedge",
"2d.line.miter.within",
"2d.line.miter.invalid",
"2d.line.cross",
"2d.line.union",
"2d.clearRect.basic",
"2d.clearRect.path",
"2d.clearRect.zero",
"2d.clearRect.negative",
"2d.clearRect.transform",
"2d.clearRect.globalalpha",
"2d.clearRect.globalcomposite",
"2d.clearRect.clip",
"2d.clearRect.shadow",
"2d.clearRect.nonfinite",
"2d.fillRect.basic",
"2d.fillRect.path",
"2d.fillRect.zero",
"2d.fillRect.negative",
"2d.fillRect.transform",
"2d.fillRect.clip",
"2d.fillRect.shadow",
"2d.fillRect.nonfinite",
"2d.strokeRect.basic",
"2d.strokeRect.path",
"2d.strokeRect.zero.1",
"2d.strokeRect.zero.2",
"2d.strokeRect.zero.3",
"2d.strokeRect.zero.4",
"2d.strokeRect.zero.5",
"2d.strokeRect.negative",
"2d.strokeRect.transform",
"2d.strokeRect.globalalpha",
"2d.strokeRect.globalcomposite",
"2d.strokeRect.clip",
"2d.strokeRect.shadow",
"2d.strokeRect.nonfinite",
"2d.path.initial",
"2d.path.beginPath",
"2d.path.moveTo.basic",
"2d.path.moveTo.newsubpath",
"2d.path.moveTo.multiple",
"2d.path.moveTo.nonfinite",
"2d.path.closePath.empty",
"2d.path.closePath.newline",
"2d.path.closePath.nextpoint",
"2d.path.lineTo.emptysubpath",
"2d.path.lineTo.basic",
"2d.path.lineTo.nextpoint",
"2d.path.lineTo.nonfinite",
"2d.path.quadraticCurveTo.emptysubpath",
"2d.path.quadraticCurveTo.basic",
"2d.path.quadraticCurveTo.shape",
"2d.path.quadraticCurveTo.scaled",
"2d.path.quadraticCurveTo.nonfinite",
"2d.path.bezierCurveTo.emptysubpath",
"2d.path.bezierCurveTo.basic",
"2d.path.bezierCurveTo.shape",
"2d.path.bezierCurveTo.scaled",
"2d.path.bezierCurveTo.nonfinite",
"2d.path.arcTo.emptysubpath",
"2d.path.arcTo.coincide.1",
"2d.path.arcTo.coincide.2",
"2d.path.arcTo.collinear.1",
"2d.path.arcTo.collinear.2",
"2d.path.arcTo.collinear.3",
"2d.path.arcTo.shape.curve1",
"2d.path.arcTo.shape.curve2",
"2d.path.arcTo.shape.start",
"2d.path.arcTo.shape.end",
"2d.path.arcTo.negative",
"2d.path.arcTo.zero.1",
"2d.path.arcTo.zero.2",
"2d.path.arcTo.transformation",
"2d.path.arcTo.scale",
"2d.path.arcTo.nonfinite",
"2d.path.arc.empty",
"2d.path.arc.nonempty",
"2d.path.arc.end",
"2d.path.arc.angle.1",
"2d.path.arc.angle.2",
"2d.path.arc.angle.3",
"2d.path.arc.angle.4",
"2d.path.arc.angle.5",
"2d.path.arc.angle.6",
"2d.path.arc.zero.1",
"2d.path.arc.zero.2",
"2d.path.arc.twopie.1",
"2d.path.arc.twopie.2",
"2d.path.arc.twopie.3",
"2d.path.arc.twopie.4",
"2d.path.arc.shape.1",
"2d.path.arc.shape.2",
"2d.path.arc.shape.3",
"2d.path.arc.shape.4",
"2d.path.arc.shape.5",
"2d.path.arc.selfintersect.1",
"2d.path.arc.selfintersect.2",
"2d.path.arc.negative",
"2d.path.arc.zeroradius",
"2d.path.arc.scale.1",
"2d.path.arc.scale.2",
"2d.path.arc.nonfinite",
"2d.path.rect.basic",
"2d.path.rect.newsubpath",
"2d.path.rect.closed",
"2d.path.rect.end.1",
"2d.path.rect.end.2",
"2d.path.rect.zero.1",
"2d.path.rect.zero.2",
"2d.path.rect.zero.3",
"2d.path.rect.zero.4",
"2d.path.rect.zero.5",
"2d.path.rect.zero.6",
"2d.path.rect.negative",
"2d.path.rect.winding",
"2d.path.rect.selfintersect",
"2d.path.rect.nonfinite",
"2d.path.fill.overlap",
"2d.path.fill.winding.add",
"2d.path.fill.winding.subtract.1",
"2d.path.fill.winding.subtract.2",
"2d.path.fill.winding.subtract.3",
"2d.path.fill.closed.basic",
"2d.path.fill.closed.unaffected",
"2d.path.stroke.overlap",
"2d.path.stroke.union",
"2d.path.stroke.unaffected",
"2d.path.stroke.scale1",
"2d.path.stroke.scale2",
"2d.path.stroke.skew",
"2d.path.stroke.empty",
"2d.path.stroke.prune.line",
"2d.path.stroke.prune.closed",
"2d.path.stroke.prune.curve",
"2d.path.stroke.prune.arc",
"2d.path.stroke.prune.rect",
"2d.path.stroke.prune.corner",
"2d.path.transformation.basic",
"2d.path.transformation.multiple",
"2d.path.transformation.changing",
"2d.path.clip.empty",
"2d.path.clip.basic.1",
"2d.path.clip.basic.2",
"2d.path.clip.intersect",
"2d.path.clip.winding.1",
"2d.path.clip.winding.2",
"2d.path.clip.unaffected",
"2d.path.isPointInPath.basic.1",
"2d.path.isPointInPath.basic.2",
"2d.path.isPointInPath.edge",
"2d.path.isPointInPath.empty",
"2d.path.isPointInPath.subpath",
"2d.path.isPointInPath.outside",
"2d.path.isPointInPath.unclosed",
"2d.path.isPointInPath.arc",
"2d.path.isPointInPath.bigarc",
"2d.path.isPointInPath.bezier",
"2d.path.isPointInPath.winding",
"2d.path.isPointInPath.transform.1",
"2d.path.isPointInPath.transform.2",
"2d.path.isPointInPath.transform.3",
"2d.path.isPointInPath.nonfinite",
"2d.drawImage.3arg",
"2d.drawImage.5arg",
"2d.drawImage.9arg.basic",
"2d.drawImage.9arg.sourcepos",
"2d.drawImage.9arg.sourcesize",
"2d.drawImage.9arg.destpos",
"2d.drawImage.9arg.destsize",
"2d.drawImage.canvas",
"2d.drawImage.self.1",
"2d.drawImage.self.2",
"2d.drawImage.null",
"2d.drawImage.wrongtype",
"2d.drawImage.floatsource",
"2d.drawImage.zerosource",
"2d.drawImage.negativesource",
"2d.drawImage.negativedest",
"2d.drawImage.outsidesource",
"2d.drawImage.incomplete",
"2d.drawImage.broken",
"2d.drawImage.animated.gif",
"2d.drawImage.animated.apng",
"2d.drawImage.animated.poster",
"2d.drawImage.path",
"2d.drawImage.transform",
"2d.drawImage.alpha",
"2d.drawImage.clip",
"2d.drawImage.composite",
"2d.drawImage.nowrap",
"2d.drawImage.nonfinite",
"2d.imageData.create.basic",
"2d.imageData.create.type",
"2d.imageData.create.initial",
"2d.imageData.create.large",
"2d.imageData.create.tiny",
"2d.imageData.create.negative",
"2d.imageData.create.zero",
"2d.imageData.create.nonfinite",
"2d.imageData.create.round",
"2d.imageData.get.basic",
"2d.imageData.get.type",
"2d.imageData.get.zero",
"2d.imageData.get.nonfinite",
"2d.imageData.get.source.outside",
"2d.imageData.get.source.negative",
"2d.imageData.get.source.size",
"2d.imageData.get.tiny",
"2d.imageData.get.nonpremul",
"2d.imageData.get.range",
"2d.imageData.get.clamp",
"2d.imageData.get.order.cols",
"2d.imageData.get.order.rows",
"2d.imageData.get.order.rgb",
"2d.imageData.get.order.alpha",
"2d.imageData.get.unaffected",
"2d.imageData.object.properties",
"2d.imageData.object.readonly",
"2d.imageData.object.ctor",
"2d.imageData.object.set",
"2d.imageData.object.undefined",
"2d.imageData.object.nan",
"2d.imageData.object.string",
"2d.imageData.object.clamp",
"2d.imageData.object.round",
"2d.imageData.put.null",
"2d.imageData.put.nonfinite",
"2d.imageData.put.basic",
"2d.imageData.put.created",
"2d.imageData.put.wrongtype",
"2d.imageData.put.cross",
"2d.imageData.put.alpha",
"2d.imageData.put.modified",
"2d.imageData.put.dirty.zero",
"2d.imageData.put.dirty.rect1",
"2d.imageData.put.dirty.rect2",
"2d.imageData.put.dirty.negative",
"2d.imageData.put.dirty.outside",
"2d.imageData.put.unchanged",
"2d.imageData.put.unaffected",
"2d.imageData.put.clip",
"2d.imageData.put.path",
"2d.shadow.attributes.shadowBlur.1",
"2d.shadow.attributes.shadowBlur.2",
"2d.shadow.attributes.shadowOffset.1",
"2d.shadow.attributes.shadowOffset.2",
"2d.shadow.attributes.shadowColor.1",
"2d.shadow.attributes.shadowColor.2",
"2d.shadow.basic.1",
"2d.shadow.basic.2",
"2d.shadow.offset.positiveX",
"2d.shadow.offset.negativeX",
"2d.shadow.offset.positiveY",
"2d.shadow.offset.negativeY",
"2d.shadow.outside",
"2d.shadow.clip.1",
"2d.shadow.clip.2",
"2d.shadow.clip.3",
"2d.shadow.stroke.basic",
"2d.shadow.stroke.cap.1",
"2d.shadow.stroke.cap.2",
"2d.shadow.stroke.join.1",
"2d.shadow.stroke.join.2",
"2d.shadow.stroke.join.3",
"2d.shadow.image.basic",
"2d.shadow.image.transparent.1",
"2d.shadow.image.transparent.2",
"2d.shadow.image.alpha",
"2d.shadow.image.section",
"2d.shadow.image.scale",
"2d.shadow.canvas.basic",
"2d.shadow.canvas.transparent.1",
"2d.shadow.canvas.transparent.2",
"2d.shadow.canvas.alpha",
"2d.shadow.pattern.basic",
"2d.shadow.pattern.transparent.1",
"2d.shadow.pattern.transparent.2",
"2d.shadow.pattern.alpha",
"2d.shadow.gradient.basic",
"2d.shadow.gradient.transparent.1",
"2d.shadow.gradient.transparent.2",
"2d.shadow.gradient.alpha",
"2d.shadow.transform.1",
"2d.shadow.transform.2",
"2d.shadow.blur.low",
"2d.shadow.blur.high",
"2d.shadow.alpha.1",
"2d.shadow.alpha.2",
"2d.shadow.alpha.3",
"2d.shadow.alpha.4",
"2d.shadow.alpha.5",
"2d.shadow.composite.1",
"2d.shadow.composite.2",
"2d.shadow.composite.3",
"2d.shadow.composite.4"
] );
</script>
</table>
</form>
<hr>
<form method="post" action="../submitresults.cgi">
<button type="button" onclick="document.getElementById('report').value = genreport()">Generate test report</button><br>
<textarea name="report" id="report" cols="100" rows="10"></textarea><br>
<input type="submit" value="Submit results"> (Submissions will tend to be ignored unless there
is a good reason why they won't be, so don't use this form unless there is such a reason.)
</form>
